/** 
 * @addtogroup alog
 * alog
 * @brief        后端接口层
 * @{
 */
 
/**
 * @file         a_log_interface.h
 * @brief        后端接口层
 * @note
 * @author       dengdeshou
 * @date         2020-07-18
 * @version      1.0
 *
 * @par          修改日志
 * <table>
 * <tr><th>Date        <th>Version               <th>Author          <th>Description
 * <tr><td>2020-07-18  <td>1.0                   <td>dengdeshou            <td>创建初始版本
 * @copyright    杭州鸿泉物联网技术股份有限公司
 */

#ifndef _ASSIST_OLOG_INTERFACE_H_
#define _ASSIST_OLOG_INTERFACE_H_

#include "ofc/ofc_types.h"
#include "ofc/ofc_object.h"

#define ALOG_TYPE_KEY_MESSAGE (1 << 3)      ///< 日志类别：关键信息
#define ALOG_TYPE_SET_PARAM   (1 << 4)      ///< 日志类别：设置参数
 
/**
 * 日志输出级别
 */
enum TALogLevelEnumTag
{
    kALogLevelSilent = 0,  ///< 静默级别
    kALogLevelAssert = 1,  ///< 断言级别
    kALogLevelError = 2,   ///< 错误级别
    kALogLevelWarning = 3, ///< 警告级别
    kALogLevelInfo = 4,    ///< 信息级别
    kALogLevelDebug = 5,   ///< 调试级别
    kALogLevelTrace = 6,   ///< 追踪级别
};
typedef enum TALogLevelEnumTag TALogLevelEnum;

typedef struct IALogTag IALog;
/**
 * 后端日志输出接口
 * @param sender: 对象指针
 * @param level: 日志级别
 * @param tag: 日志标签
 * @param ticks: 时间戳
 * @param log: 日志内容
 * @param len: 日志内容长度
 * @return 实际输出的大小
 */
typedef Int32(*IALogDoBackendOutput)(IALog *sender, UInt32 level, const Int8 *tag, UInt32 ticks, const Int8 *log, Int16 len);

/**
 * 立即刷新缓存接口
 * @param sender: 对象指针
 * @return
 */
typedef void(*IALogDoBackendFlush)(IALog *sender);

/**
 * 后端输出接口层
 */
struct IALogTag
{
    PROTECTED
        IALogDoBackendOutput DoBackendOutput;  ///< 后端输出事件
        IALogDoBackendFlush DoBackendFlush;    ///< 后端刷新缓存事件
};

/**
 * 后端日志输出接口
 * @param sender: 对象指针
 * @param level: 日志级别
 * @param tag: 日志标签
 * @param ticks: 时间戳
 * @param log: 日志内容
 * @param len: 日志内容长度
 * @return 实际输出的大小
 */
Int32 IALogBackendOutput(IALog *sender,
    UInt32 level,
    const Int8 *tag,
    UInt32 ticks,
    const Int8 *log,
    Int16 len);

/**
 * 立即刷新缓存接口
 * @param sender: 对象指针
 * @return
 */
Int32 IALogBackendFlush(IALog *sender);

#endif
/**
 * @} 
 */
